package com.fanix5.javamvvm.utils;

import android.content.Context;
import android.graphics.Bitmap;
import android.widget.ImageView;

import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.bumptech.glide.Glide;
import com.bumptech.glide.RequestManager;
import com.bumptech.glide.load.resource.bitmap.CenterCrop;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.request.RequestOptions;
import com.fanix5.javamvvm.R;

import java.io.ByteArrayOutputStream;

/**
 * FileName: BaseImageLoader
 * Author: Admin
 * Date: 2020/11/14 8:40
 * Description: 图片加载工具类
 */
public class ImageLoaderUtils {

    private static volatile ImageLoaderUtils instance;

    private int radius;

    public static ImageLoaderUtils getInstance() {
        if (instance == null) {
            synchronized (ImageLoaderUtils.class) {
                if (instance == null) {
                    instance = new ImageLoaderUtils();
                }
            }
        }
        return instance;
    }

    public void init(int radius) {
        this.radius = radius;
    }

    /**
     * 在imageView里面显示图片
     *
     * @param resourceId resourceId
     * @param imageView  image控件
     */
    public void display(@DrawableRes @Nullable Integer resourceId, ImageView imageView) {
        display(Glide.with(imageView), resourceId, imageView);
    }

    /**
     * 在imageView里面显示图片
     *
     * @param requestManager 加载管理器
     * @param resourceId     resourceId
     * @param imageView      image控件
     */
    public void display(@NonNull RequestManager requestManager, @DrawableRes @Nullable Integer resourceId,
                        ImageView imageView) {
        display(requestManager, resourceId, imageView, R.drawable.ic_img_placeholder);
    }

    /**
     * 在imageView里面显示图片
     *
     * @param requestManager 加载管理器
     * @param resourceId     resourceId
     * @param imageView      image控件
     * @param placeholder    占位符
     */
    public void display(@NonNull RequestManager requestManager, @DrawableRes @Nullable Integer resourceId,
                        @NonNull ImageView imageView,
                        @DrawableRes int placeholder) {
        requestManager
                .load(resourceId)
                .apply(new RequestOptions())
                .dontAnimate()
                .placeholder(placeholder)
                .into(imageView);
    }

    /**
     * 在imageView里面显示图片
     *
     * @param url       路径
     * @param imageView image控件
     */
    public void display(@Nullable String url, @NonNull ImageView imageView) {
        display(Glide.with(imageView), url, imageView);
    }

    /**
     * 在imageView里面显示图片
     *
     * @param requestManager 加载管理器
     * @param url            路径
     * @param imageView      image控件
     */
    public void display(@NonNull RequestManager requestManager, @Nullable String url, @NonNull ImageView imageView) {
        display(requestManager, url, imageView, R.drawable.ic_img_placeholder);
    }

    /**
     * 在imageView里面显示图片
     *
     * @param requestManager 加载管理器
     * @param url            路径
     * @param imageView      image控件
     * @param placeholder    占位符
     */
    public void display(@NonNull RequestManager requestManager, @Nullable String url, @NonNull ImageView imageView,
                        @DrawableRes int placeholder) {
        requestManager
                .load(url)
                .apply(new RequestOptions())
                .dontAnimate()
                .placeholder(placeholder)
                .into(imageView);
    }

    /**
     * 在imageView里面显示图片
     *
     * @param bitmap    位图
     * @param imageView image控件
     */
    public void display(@NonNull Bitmap bitmap, @NonNull ImageView imageView) {
        display(Glide.with(imageView), bitmap, imageView);
    }

    /**
     * 在imageView里面显示图片
     *
     * @param requestManager 加载管理器
     * @param bitmap         位图
     * @param imageView      image控件
     */
    public void display(@NonNull RequestManager requestManager, @NonNull Bitmap bitmap, @NonNull ImageView imageView) {
        display(requestManager, bitmap, imageView, R.drawable.ic_img_placeholder);
    }

    /**
     * 在imageView里面显示图片
     *
     * @param requestManager 加载管理器
     * @param bitmap         位图
     * @param imageView      image控件
     * @param placeholder    占位符
     */
    public void display(@NonNull RequestManager requestManager, @NonNull Bitmap bitmap, @NonNull ImageView imageView,
                        @DrawableRes int placeholder) {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
        requestManager
                .load(byteArrayOutputStream.toByteArray())
                .dontAnimate()
                .apply(new RequestOptions())
                .dontAnimate()
                .placeholder(placeholder)
                .into(imageView);
    }

    /**
     * 在imageView里面显示图片
     *
     * @param resourceId resourceId
     * @param width      宽度
     * @param height     高度
     * @param imageView  image控件
     */
    public void display(@DrawableRes @Nullable Integer resourceId, int width, int height,
                        @NonNull ImageView imageView) {
        display(Glide.with(imageView), resourceId, width, height, imageView);
    }

    /**
     * 在imageView里面显示图片
     *
     * @param requestManager 加载管理器
     * @param resourceId     resourceId
     * @param width          宽度
     * @param height         高度
     * @param imageView      image控件
     */
    public void display(@NonNull RequestManager requestManager, @DrawableRes @Nullable Integer resourceId, int width,
                        int height,
                        @NonNull ImageView imageView) {
        display(requestManager, resourceId, width, height, imageView, R.drawable.ic_img_placeholder);
    }

    /**
     * 在imageView里面显示图片
     *
     * @param requestManager 加载管理器
     * @param resourceId     resourceId
     * @param width          宽度
     * @param height         高度
     * @param imageView      image控件
     * @param placeholder    占位符
     */
    public void display(@NonNull RequestManager requestManager, @DrawableRes @Nullable Integer resourceId, int width,
                        int height,
                        @NonNull ImageView imageView,
                        @DrawableRes int placeholder) {
        requestManager
                .load(resourceId)
                .apply(new RequestOptions().override(width, height))
                .dontAnimate()
                .placeholder(placeholder)
                .into(imageView);
    }

    /**
     * 在imageView里面显示图片
     *
     * @param str       路径
     * @param width     宽度
     * @param height    高度
     * @param imageView image控件
     */
    public void display(@Nullable String str, int width, int height, @NonNull ImageView imageView) {
        display(Glide.with(imageView), str, width, height, imageView);
    }

    /**
     * 在imageView里面显示图片
     *
     * @param requestManager 加载管理器
     * @param str            路径
     * @param width          宽度
     * @param height         高度
     * @param imageView      image控件
     */
    public void display(@NonNull RequestManager requestManager, @Nullable String str, int width, int height,
                        @NonNull ImageView imageView) {
        display(requestManager, str, width, height, imageView, R.drawable.ic_img_placeholder);
    }

    /**
     * 在imageView里面显示图片
     *
     * @param requestManager 加载管理器
     * @param str            路径
     * @param width          宽度
     * @param height         高度
     * @param imageView      image控件
     * @param placeholder    占位符
     */
    public void display(@NonNull RequestManager requestManager, @Nullable String str, int width, int height,
                        @NonNull ImageView imageView,
                        @DrawableRes int placeholder) {
        requestManager
                .load(str)
                .apply(new RequestOptions().override(width, height))
                .dontAnimate()
                .placeholder(placeholder)
                .into(imageView);
    }

    /**
     * 在imageView里面显示图片
     *
     * @param requestManager 加载管理器
     * @param bitmap         位图
     * @param width          宽度
     * @param height         高度
     * @param imageView      image控件
     */
    public void display(RequestManager requestManager, Bitmap bitmap, int width, int height, ImageView imageView) {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
        requestManager
                .load(byteArrayOutputStream.toByteArray())
                .apply(new RequestOptions().override(width, height))
                .dontAnimate()
                .placeholder(R.drawable.ic_img_placeholder)
                .into(imageView);
    }

    /**
     * 在imageView里面显示圆形图片
     *
     * @param str       路径
     * @param imageView image控件
     */
    public void displayAvatar(@NonNull String str, @NonNull ImageView imageView) {
        displayAvatar(Glide.with(imageView), str, imageView);
    }

    /**
     * 在imageView里面显示圆形图片
     *
     * @param requestManager 加载管理器
     * @param str            路径
     * @param imageView      image控件
     */
    public void displayAvatar(@NonNull RequestManager requestManager, @NonNull String str,
                              @NonNull ImageView imageView) {
        displayCircle(requestManager, str, imageView, R.drawable.ic_img_placeholder);
    }

    /**
     * 在imageView里面显示圆形头像
     *
     * @param resourceId resourceId
     * @param imageView  image控件
     */
    public void displayAvatar(@DrawableRes @Nullable Integer resourceId, @NonNull ImageView imageView) {
        displayAvatar(Glide.with(imageView), resourceId, imageView);
    }

    /**
     * 在imageView里面显示圆形头像
     *
     * @param requestManager 加载管理器
     * @param resourceId     resourceId
     * @param imageView      image控件
     */
    public void displayAvatar(@NonNull RequestManager requestManager, @DrawableRes @Nullable Integer resourceId,
                              @NonNull ImageView imageView) {
        displayCircle(requestManager, resourceId, imageView, R.drawable.ic_img_placeholder);
    }

    /**
     * 在imageView里面显示圆形图片
     *
     * @param resourceId resourceId
     * @param imageView  image控件
     */
    public void displayCircle(@DrawableRes @Nullable Integer resourceId, @NonNull ImageView imageView) {
        displayCircle(Glide.with(imageView), resourceId, imageView);
    }

    /**
     * 在imageView里面显示圆形图片
     *
     * @param requestManager 加载管理器
     * @param resourceId     resourceId
     * @param imageView      image控件
     */
    public void displayCircle(@NonNull RequestManager requestManager, @DrawableRes @Nullable Integer resourceId,
                              @NonNull ImageView imageView) {
        displayCircle(requestManager, resourceId, imageView, R.drawable.ic_img_placeholder);
    }

    /**
     * 在imageView里面显示圆形图片
     *
     * @param requestManager 加载管理器
     * @param resourceId     resourceId
     * @param imageView      image控件
     * @param placeholder    占位符
     */
    public void displayCircle(@NonNull RequestManager requestManager, @DrawableRes @Nullable Integer resourceId,
                              @NonNull ImageView imageView,
                              @DrawableRes int placeholder) {
        requestManager
                .load(resourceId)
                .apply(RequestOptions.circleCropTransform())
                .dontAnimate()
                .placeholder(placeholder)
                .into(imageView);
    }

    /**
     * 在imageView里面显示圆形图片
     *
     * @param str       路径
     * @param imageView image控件
     */
    public void displayCircle(@NonNull String str, @NonNull ImageView imageView) {
        displayCircle(Glide.with(imageView), str, imageView, R.drawable.ic_img_placeholder);
    }

    /**
     * 在imageView里面显示圆形图片
     *
     * @param requestManager 加载管理器
     * @param str            路径
     * @param imageView      image控件
     */
    public void displayCircle(@NonNull RequestManager requestManager, @NonNull String str,
                              @NonNull ImageView imageView) {
        displayCircle(requestManager, str, imageView, R.drawable.ic_img_placeholder);
    }

    /**
     * 在imageView里面显示圆形图片
     *
     * @param requestManager 加载管理器
     * @param str            路径
     * @param imageView      image控件
     * @param placeholder    占位符
     */
    public void displayCircle(@NonNull RequestManager requestManager, @NonNull String str, @NonNull ImageView imageView,
                              @DrawableRes int placeholder) {
        requestManager
                .load(str)
                .apply(RequestOptions.circleCropTransform())
                .dontAnimate()
                .placeholder(placeholder)
                .into(imageView);
    }

    /**
     * 在imageView里面显示圆形图片
     *
     * @param requestManager 加载管理器
     * @param bitmap         位图
     * @param imageView      image控件
     */
    public void displayCircle(RequestManager requestManager, Bitmap bitmap, ImageView imageView) {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
        requestManager
                .load(byteArrayOutputStream.toByteArray())
                .apply(RequestOptions.circleCropTransform())
                .dontAnimate()
                .placeholder(R.drawable.ic_img_placeholder)
                .into(imageView);
    }

    /**
     * 在imageView中显示圆角图片
     *
     * @param resourceId resourceId
     * @param imageView  image控件
     */
    public void displayRadius(@DrawableRes @Nullable Integer resourceId, ImageView imageView) {
        displayRadius(Glide.with(imageView), resourceId, imageView);
    }

    /**
     * 在imageView中显示圆角图片
     *
     * @param requestManager 加载管理器
     * @param resourceId     resourceId
     * @param imageView      image控件
     */
    public void displayRadius(@NonNull RequestManager requestManager, @DrawableRes @Nullable Integer resourceId,
                              ImageView imageView) {
        displayRadius(requestManager, resourceId, imageView, R.drawable.ic_img_placeholder);
    }

    /**
     * 在imageView中显示圆角图片
     *
     * @param requestManager 加载管理器
     * @param resourceId     resourceId
     * @param imageView      image控件
     * @param placeholder    占位符
     */
    public void displayRadius(@NonNull RequestManager requestManager, @DrawableRes @Nullable Integer resourceId,
                              @NonNull ImageView imageView,
                              @DrawableRes int placeholder) {
        requestManager
                .load(resourceId)
                .apply(new RequestOptions().transform(new CenterCrop(), new RoundedCorners(this.radius)))
                .dontAnimate()
                .placeholder(placeholder)
                .into(imageView);
    }

    /**
     * 在imageView中显示圆角图片
     *
     * @param url       路径
     * @param imageView image控件
     */
    public void displayRadius(@NonNull String url, @NonNull ImageView imageView) {
        displayRadius(Glide.with(imageView), url, imageView);
    }

    /**
     * 在imageView中显示圆角图片
     *
     * @param requestManager 加载管理器
     * @param url            路径
     * @param imageView      image控件
     */
    public void displayRadius(@NonNull RequestManager requestManager, @NonNull String url,
                              @NonNull ImageView imageView) {
        displayRadius(requestManager, url, imageView, R.drawable.ic_img_placeholder);
    }

    /**
     * 在imageView中显示圆角图片
     *
     * @param requestManager 加载管理器
     * @param url            路径
     * @param imageView      image控件
     * @param placeholder    占位符
     */
    public void displayRadius(@NonNull RequestManager requestManager, @NonNull String url, @NonNull ImageView imageView,
                              @DrawableRes int placeholder) {
        requestManager
                .load(url)
                .apply(new RequestOptions().transform(new CenterCrop(), new RoundedCorners(this.radius)))
                .dontAnimate()
                .placeholder(placeholder)
                .into(imageView);
    }

    /**
     * 在imageView中显示圆角图片
     *
     * @param resourceId resourceId
     * @param imageView  image控件
     * @param radius     圆角
     */
    public void displayRadius(@DrawableRes @Nullable Integer resourceId, @NonNull ImageView imageView, int radius) {
        displayRadiusWithRadius(Glide.with(imageView), resourceId, imageView, radius);
    }

    /**
     * 在imageView中显示圆角图片
     *
     * @param requestManager 加载管理器
     * @param resourceId     resourceId
     * @param imageView      image控件
     * @param radius         圆角
     */
    public void displayRadiusWithRadius(@NonNull RequestManager requestManager,
                                        @DrawableRes @Nullable Integer resourceId,
                                        @NonNull ImageView imageView, int radius) {
        displayRadiusWithRadius(requestManager, resourceId, imageView, radius, R.drawable.ic_img_placeholder);
    }

    /**
     * 在imageView中显示圆角图片
     *
     * @param requestManager 加载管理器
     * @param resourceId     resourceId
     * @param imageView      image控件
     * @param placeholder    占位符
     * @param radius         圆角
     */
    public void displayRadiusWithRadius(@NonNull RequestManager requestManager,
                                        @DrawableRes @Nullable Integer resourceId,
                                        @NonNull ImageView imageView,
                                        int radius, @DrawableRes int placeholder) {
        requestManager
                .load(resourceId)
                .apply(new RequestOptions().transform(new CenterCrop(), new RoundedCorners(radius)))
                .dontAnimate()
                .placeholder(placeholder)
                .into(imageView);
    }

    /**
     * 在imageView中显示圆角图片
     *
     * @param url       resourceId
     * @param imageView image控件
     * @param radius    圆角
     */
    public void displayRadius(@NonNull String url, @NonNull ImageView imageView, int radius) {
        displayRadiusWithRadius(Glide.with(imageView), url, imageView, radius);
    }

    /**
     * 在imageView中显示圆角图片
     *
     * @param requestManager 加载管理器
     * @param url            resourceId
     * @param imageView      image控件
     * @param radius         圆角
     */
    public void displayRadiusWithRadius(@NonNull RequestManager requestManager, @NonNull String url,
                                        @NonNull ImageView imageView, int radius) {
        displayRadiusWithRadius(requestManager, url, imageView, radius, R.drawable.ic_img_placeholder);
    }

    /**
     * 在imageView中显示圆角图片
     *
     * @param requestManager 加载管理器
     * @param url            路径
     * @param imageView      image控件
     * @param placeholder    占位符
     * @param radius         圆角
     */
    public void displayRadiusWithRadius(@NonNull RequestManager requestManager, @NonNull String url,
                                        @NonNull ImageView imageView,
                                        int radius, @DrawableRes int placeholder) {
        requestManager
                .load(url)
                .apply(new RequestOptions().transform(new CenterCrop(), new RoundedCorners(radius)))
                .dontAnimate()
                .placeholder(placeholder)
                .into(imageView);
    }

    /**
     * 在imageView中显示圆角图片
     *
     * @param requestManager 加载管理器
     * @param bitmap         位图
     * @param imageView      image控件
     */
    public void displayRadius(RequestManager requestManager, Bitmap bitmap, ImageView imageView) {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
        requestManager
                .load(byteArrayOutputStream.toByteArray())
                .apply(new RequestOptions().transform(new CenterCrop(), new RoundedCorners(this.radius)))
                .dontAnimate()
                .placeholder(R.drawable.ic_img_placeholder)
                .into(imageView);
    }

    /**
     * 截取视频截图
     *
     * @param imageView 图片View
     * @param url       视频地址
     * @param context   上下文
     * @param frame     帧数
     */
    public void displayLoadCover(ImageView imageView, String url, Context context, int frame) {
        int mFrame = frame * 1000000;
        Glide.with(context)
                .setDefaultRequestOptions(
                        new RequestOptions()
                                .frame(mFrame)
                                .centerCrop()
                )
                .load(url)
                .into(imageView);
    }
}